//
//  main.m
//  OC04_NSString_NSNumber_NSValue
//
//  Created by Rain on 16/1/28.
//  Copyright © 2016年 Rain. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
#pragma mark - 知识点1 NSString 不可变字符串
    
    /** NSString: 创建以后, 内容和长度不能改变. */
    
    
#if 0   /** 初始化(init)  */
    NSString *str1 = [[NSString alloc] initWithString:@"iphone"];
    
    
    /** 字面量写法. 推荐此写法. */
    NSString *str2 = @"iphone";
    
    NSString *str3 = [[NSString alloc] initWithFormat:@"I have an %@", str1];
    NSLog(@"str3:%@", str3);
    

    int a = 100;
    NSString *str4 = [[NSString alloc] initWithFormat:@"%d", a];
    NSLog(@"str4:%@", str4); /**< 注意, 此时的100是字符串. */

#endif
    
    
#if 0    /** 便利构造器(string) */
    
    NSString *str1 = [NSString stringWithString:@"iphone"];
    
    
    NSString *str2 = [NSString stringWithFormat:@"i have an %@", str1];
    NSLog(@"str2:%@",str2);
    

#endif
    
    
    
#if 0 /** 获取字符串长度(length) */
    
    NSString *str1 = @"I have an iphone";
    
    NSLog(@"%ld", str1.length); /**< 使用点语法调用属性值. */
    
    NSLog(@"%ld", [str1 length]); /** 使用消息语法. */
  
#endif
    
   
#if 0 /** 获取字符串中字符(character) */
    
    NSString *str1 = @"abcde";
    
    // 需求, 取出字符'd'
    unichar c = [str1 characterAtIndex:3];
    NSLog(@"c:%c", c);
    
    
#endif
    
#if 0   /** 字符串是否相等(equal) */
    
    NSString *str1 = @"Tom";
    
    NSString *inputStr2 = @"tom";
    
    BOOL isEqual = [str1 isEqualToString:inputStr2];
    
    if (isEqual) {
        NSLog(@"用户存在");
    } else {
        NSLog(@"用户不存在");
        
    }
    
    
    
#endif
    

#if 0  /** 获取子串(sub) */
    
    NSString *str1 = @"I have an iphone";
    
    // 获取字符串"iphone"
    NSString *sub1 = [str1 substringFromIndex:10];
    NSLog(@"sub1:%@", sub1);
    
    // 获取字符串"have"
    
    NSRange range = NSMakeRange(2, 4); /**< 使用函数创建NSRange结构体. */
    
    NSString *sub2 = [str1 substringWithRange:range];
    NSLog(@"sub2:%@", sub2);
    
    // 连写
    NSString *sub22 = [str1 substringWithRange:NSMakeRange(2, 4)];
    NSLog(@"sub22:%@", sub22);
    
    
    
    // 获取字符串"I"
    NSString *sub3 = [str1 substringToIndex:1];
    NSLog(@"sub3:%@", sub3);
    
    
    
    
    
    
#endif
    
    
    
#if 0   /** 拼接字符串(append)  */
    
    NSString *str1 = @"I have an iphone";
    NSString *str2 = @"6s";
    
    NSString *str3 = [str1 stringByAppendingString:str2];
    NSLog(@"str3:%@", str3);
    
#endif
    
   
#if 0  /** 替换字符串(replace) */
    
    NSString *str1 = @"I have an iphone";
    
    // API
    NSString *newStr = [str1 stringByReplacingCharactersInRange:NSMakeRange(10, 6) withString:@"xiaomi"];
    NSLog(@"newStr:%@", newStr);
    
    // API
    NSString *newStr2 = [str1 stringByReplacingOccurrencesOfString:@"Iphone" withString:@"xiaomi"];
    NSLog(@"newStr2:%@", newStr2);

    
#endif
    
#if 0  /** 字符串对象转化为int类型(int) */
    
    int a = 100;
    NSString *number1 = [NSString stringWithFormat:@"%d", a];
    
    int newA = [number1 intValue];
    NSLog(@"newA:%d", newA);
    
    NSString *str = @"iphone";
    int new = [str intValue];
    NSLog(@"new:%d", new);
    

#endif
   
#if 1    /** 字符串对象转化为其他数据类型, 例如double, float, BOOL等. */
    
    // API查询 关键字: value
    
#endif
    
    
   
#if 0   /** 字符串全部大写(uppercase) */
    
    NSString *str1 = @"i have an iphone";
    
    NSString *UPStr1 = [str1 uppercaseString];
    NSLog(@"UPStr1:%@", UPStr1);

    
    /** 字符串全部小写(lowercase) */
    
    NSString *lowStr = [UPStr1 lowercaseString];
    NSString *low = UPStr1.lowercaseString;
    
    NSLog(@"lowStr:%@", lowStr);
    
#endif
    
#if 0  /** 字符串首字母大写(capitalized) */
    
    NSString *str = @"i have an iphone";
    NSString *newStr = [str capitalizedString];
    NSLog(@"newStr:%@", newStr);
    
#endif
    

#if 0   /** 是否以指定字符串为前缀(prefix) */
    
    NSString *str = @"www.baidu.com";
    
    if ([str hasPrefix:@"www"]) {
        NSLog(@"以www开头");
    } else {
        NSLog(@"不以www开头");
    }
    
    

    /** 是否以指定字符串为后缀(suffix) */
    if ([str hasSuffix:@".com"]) {
        NSLog(@"以com结尾");
    } else {
        NSLog(@"不以com结尾");
    }
    
    
    
    /** 练习: http://www.lanou3g.com/icon.png 判断上述字符串中是否以“png”结尾，如果是就替换成“jpg”，如果不是，就拼接”.jpg”。*/
    
    
    NSString *url = @"http://www.lanou3g.com/icon.png";
    
    NSString *newUrl = nil;
    
    if ([url hasSuffix:@"png"]) {
        
        newUrl = [url stringByReplacingOccurrencesOfString:@"png" withString:@"jpg"];
        
    } else {
        
        newUrl = [url stringByAppendingString:@".jpg"];
    }
    
    NSLog(@"newUrl:%@", newUrl);

#endif
    
#pragma mark - 知识点 NSMutableString 可变字符串
    
    /**
     * NSMutableString: 创建以后内容还可以修改, 可以进行增, 删, 改等操作.
     * 是NSString的子类
     * 注: 涉及到可变的类, 关键字是mutable.
     */
    
    
#if 0    /** 初始化方法(init) */
    NSMutableString *mStr = [[NSMutableString alloc] initWithCapacity:20];

    
    /** 便利构造器(string) */
    NSMutableString *mStr2 = [NSMutableString stringWithCapacity:20];
    
    /** 拼接字符串(append) */
    
    NSMutableString *mStr1 = @"i have an iphone".mutableCopy;
    
    [mStr1 appendString:@"6s"];
    NSLog(@"mStr1:%@", mStr1);
    
    NSString *newStr = [mStr1 stringByAppendingString:@"6s"];
    NSLog(@"mStr1:%@", mStr1);
    

    /** 插入字符串(insert) */
    NSMutableString *mStr = @"i have iphone".mutableCopy;
    
    
    [mStr insertString:@"an " atIndex:7];
    NSLog(@"mStr:%@", mStr);
    


    /** 删除字符串(delete) */
    NSMutableString *mStr = @"I have an iphone".mutableCopy;
    
    // 查找是否含有"an"字符串, 返回NSRange
    NSRange range = [mStr rangeOfString:@"an"];
    
    
    [mStr deleteCharactersInRange:range];
    NSLog(@"%@", mStr);
    
    
    /** 替换字符串(replace) */
    NSRange range2 = [mStr rangeOfString:@"iphone"];
    
    [mStr replaceCharactersInRange:range2 withString:@"xiaomi"];
    
    NSLog(@"mStr:%@", mStr);
    
    /** 重置字符串(set) */
    [mStr setString:@"huawei"];
    NSLog(@"mStr:%@", mStr);
    
    
    /**
     * 不可变字符串:
     * 本身不能被修改.
     * 对不可变字符串的修改操作, 都是操作字符串的副本, 得到一个新的字符串并返回.
     * 可变字符串:
     * 本身能被修改.
     * 可变字符串修改的是原字符串, 因此可变字符串的操作方法没有返回值.
     */
    
    
    /** 练习: 用NSMutableString完成下述功能：
     http://www.lanou3g.com/icon.png
     判断上述字符串中是否以“png”结尾，如果是就替换成“jpg”，如果不是，就拼接”.jpg”。
     */
    
#endif
    
#pragma mark - 知识点2 NSNumber 数值类
    
    /** 作用: 实现基本数据类型和对象类型的相互转化. */
    
    
    /** int类型转化为NSNumber类型的对象 */
    int a = 100;
    
    NSNumber *intNumber = [[NSNumber alloc] initWithInt:a];
    NSLog(@"intNumber:%@", intNumber);
    
    NSNumber *intNumber2 = [NSNumber numberWithInt:a];
    NSLog(@"intNumber2:%@", intNumber2);
    
    // 字面量
    NSNumber *intNumber3 = @(a);
    NSNumber *intNunber4 = @20;
    
    /** 
     * 注意, @"20" 字面量创建的是 字符串 对象.
            @20 字面量创建的是 NSNunber 对象.
     */
    
    
    
    
    /** float类型转化为NSNumber类型的对象 */
    
    
    /** char类型转化为NSNumber类型的对象 */
    
    
    /** NSNumber类型对象转化为int类型的数据 */
    
    NSNumber *num1 = @20;
    
    int num1ForInt = [num1 intValue];
    NSLog(@"num1ForInt: %d", num1ForInt);
    
    
    
    
    
    
    /** NSNumber类型对象转化为float类型的数据 */
    
    
    /** NSNumber类型对象转化为char类型的数据 */
    
    
    /** NSNumber类型对象的比较(compare) */
    NSNumber *number1 = @20;
    NSNumber *number2 = @100;
    
    if ([number1 compare:number2] == NSOrderedAscending) {
        
        NSLog(@"number1 小于 number2");
    } else if ([number1 compare:number2] == NSOrderedDescending) {
        
        NSLog(@"number1 大于 number2");
    } else {
        NSLog(@"number1 等于 number2");
    }

    
#pragma mark - 知识点3 NSValue
    
    /** 作用之一: 结构体和对象类型的转化. */

    /** NSRange类型转化为NSValue类型的对象 */
    
    NSRange range1 = {2, 10};
    NSRange range2 = NSMakeRange(2, 10);
    
    NSValue *value = [NSValue valueWithRange:range2];
    NSLog(@"value:%@", value);
    
    /** NSValue类型转化为NSRange类型的结构体变量 */
    NSRange range3 = value.rangeValue;
    NSLog(@"rang3:%ld, %ld", range3.location, range3.length);

    
    /** 指针转化为NSValue. */
    
    int b = 100;
    int *p = &b;
    
    NSValue *value2 = [NSValue valueWithPointer:p];
    NSLog(@"%@", value2);
    
    
    
    
    /** NSValue 转化为 指针. */
    int *p2 = [value2 pointerValue];
    NSLog(@"%d", *p2);
    
    
    /** 自定义结构体转化为NSValue对象 */
    
    
    
    
    
    
    
    
    
    
    
    /** NSValue对象转化为自定义结构体 */
    
    
    
    return 0;
}
